package com.cskaoyan.javase.thread._3runnable;

/**
 * 实现多线程的方式二:
 * 基于Runnable接口的实现类对象来新建一个线程
 * 实际上是使用了Thread类的两个构造方法:
 * Thread(Runnable target)
 * Thread(Runnable target,String name)
 * 下一个构造器无非是加上线程的名字,和第一个构造器没有本质区别
 * 实现Runnable接口接口需要重写run方法,这时通过Thread类的构造器,将Runnable接口的实现类对象传入Thread类
 * 实际上就是将run方法的实现传入Thread类的构造器
 * 这里是将方法作为参数进行传递,这就是方法的回调,被传递的方法就是回调方法
 *
 * @since 11:35
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Thread t = new Thread(new RunnableImpl(), "张三");
        t.start();

        // 匿名内部类实现
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println("6666666!");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

        // Lambda表达式实现
        new Thread(new Demo()::myRun).start();
    }

    public void myRun() {
        for (int i = 0; i < 10; i++) {
            System.out.println("7777777!");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class RunnableImpl implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("hello world!");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}